/******************************************************************************* * Copyright (c) 2008 Scott Stanchfield * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package com.javadude.dependencies.editparts; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.draw2d.AbsoluteBendpoint; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PolygonDecoration; import org.eclipse.draw2d.PolylineConnection; import org.eclipse.draw2d.graph.CompoundDirectedGraph; import org.eclipse.draw2d.graph.Edge; import org.eclipse.draw2d.graph.Node; import org.eclipse.draw2d.graph.NodeList; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.AbstractConnectionEditPart; import org.eclipse.gef.editpolicies.ConnectionEditPolicy; import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy; import org.eclipse.gef.requests.GroupRequest; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import com.javadude.dependencies.DependenciesPlugin; import com.javadude.dependencies.Dependency; import com.javadude.dependencies.commands.DeleteCommand; public class DependencyEditPart extends AbstractConnectionEditPart { private static final String GREEN = "green"; private static final String RED = "red"; private static final String YELLOW = "yellow"; private static final String BLACK = "black"; private static final String BLUE = "blue"; private static final String WHITE = "white"; private static final String PINK = "pink"; private String lineColor = DependencyEditPart.BLACK; private IWorkbenchPage page; /** * Constructor of the ProjectEditPart class */ public DependencyEditPart(IWorkbenchPage page) { this.page = page; DependenciesPlugin.getDefault().setColor(DependencyEditPart.GREEN, 0,255,0); DependenciesPlugin.getDefault().setColor(DependencyEditPart.PINK, 255,20,147); DependenciesPlugin.getDefault().setColor(DependencyEditPart.YELLOW, 250,250,210); DependenciesPlugin.getDefault().setColor(DependencyEditPart.RED, 255,0,0); DependenciesPlugin.getDefault().setColor(DependencyEditPart.BLACK, 0,0,0); DependenciesPlugin.getDefault().setColor(DependencyEditPart.BLUE, 0,0,255); DependenciesPlugin.getDefault().setColor(DependencyEditPart.WHITE, 255,255,255); } private ISelectionListener listener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (selection instanceof IStructuredSelection) { Dependency dependency = (Dependency) getModel(); lineColor = DependencyEditPart.BLACK; if (DependencyManager.indirectPathExists(dependency, dependency.getSource(), dependency.getTarget())) { lineColor = DependencyEditPart.WHITE; } else { IStructuredSelection structuredSelection = (IStructuredSelection) selection; boolean isSource = false; boolean isTarget = false; for (Iterator<?> i = structuredSelection.iterator(); i.hasNext();) { Object o = i.next(); if (o instanceof JavaProjectEditPart) { EditPart editPart = (EditPart) o; o = editPart.getModel(); } if (o instanceof IJavaProject) { if (dependency.getSource().equals(o)) { isSource = true; } else if (dependency.getTarget().equals(o)) { isTarget = true; } } } if (isSource && isTarget) { lineColor = DependencyEditPart.BLUE; } else if (isSource) { lineColor = DependencyEditPart.GREEN; } else if (isTarget) { lineColor = DependencyEditPart.RED; } else { lineColor = DependencyEditPart.BLACK; } } refreshVisuals(); } } }; /** * Creates a PolylineConnection that represents a dependency */ @Override protected IFigure createFigure() { PolylineConnection connection = new PolylineConnection(); // set the target decoration to be an arrow connection.setTargetDecoration(new PolygonDecoration()); return connection; } @Override protected void refreshVisuals() { Dependency dependency = (Dependency) getModel(); if (!dependency.isExported()) { ((PolylineConnection) getFigure()).setLineStyle(Graphics.LINE_DOT); lineColor = DependencyEditPart.PINK; } if (DependencyManager.indirectPathExists(dependency, dependency.getSource(), dependency.getTarget())) { lineColor = DependencyEditPart.WHITE; } figure.setForegroundColor(DependenciesPlugin.getDefault().getColor(lineColor)); } /** * Create edit policies for the DependencyEditPart. Allows a dependency to * be selected and deleted. */ @Override protected void createEditPolicies() { // Selection handle edit policy. Makes the connection show a feedback, // when selected by the user. installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy()); // Edit policy to allow the removal of a dependency. To support the // removal of a dependency, // a DeleteCommand instance is created installEditPolicy(EditPolicy.CONNECTION_ROLE, new ConnectionEditPolicy() { @Override protected Command getDeleteCommand(GroupRequest request) { return new DeleteCommand((Dependency) getModel()); } }); } @Override public void activate() { super.activate(); page.addSelectionListener(listener); } @Override public void deactivate() { page.removeSelectionListener(listener); super.deactivate(); } @SuppressWarnings("unchecked") public void contributeToGraph(CompoundDirectedGraph graph, @SuppressWarnings("rawtypes") Map map) { Node source = (Node)map.get(getSource()); Node target = (Node)map.get(getTarget()); Edge e = new Edge(this, source, target); e.weight = 2; graph.edges.add(e); map.put(this, e); } protected void applyGraphResults(CompoundDirectedGraph graph, @SuppressWarnings("rawtypes") Map map) { Edge e = (Edge)map.get(this); NodeList nodes = e.vNodes; PolylineConnection conn = (PolylineConnection)getConnectionFigure(); conn.setTargetDecoration(new PolygonDecoration()); if (nodes != null) { List<AbsoluteBendpoint> bends = new ArrayList<AbsoluteBendpoint>(); for (int i = 0; i < nodes.size(); i++) { Node vn = nodes.getNode(i); int x = vn.x; int y = vn.y; if (e.isFeedback()) { bends.add(new AbsoluteBendpoint(x, y + vn.height)); bends.add(new AbsoluteBendpoint(x, y)); } else { bends.add(new AbsoluteBendpoint(x, y)); bends.add(new AbsoluteBendpoint(x, y + vn.height)); } } conn.setRoutingConstraint(bends); } else { conn.setRoutingConstraint(Collections.EMPTY_LIST); } } }